package com.fy.payment.server;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.fy.common.pojo.ObjectOrder;
import com.fy.payment.config.AliPayConfig;
import com.fy.paymeny.api.PayService;
import com.fy.paymeny.vo.AliPay;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;

/**
 * @author 芣苡
 */
public class PayServiceImpl implements PayService {
    private static final String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do";
    private static final String FORMAT = "JSON";
    private static final String CHARSET = "UTF-8";
    //签名方式
    private static final String SIGN_TYPE = "RSA2";

    @Resource
    private AliPayConfig aliPayConfig;

    @Override
    public void pay(AliPay aliPay, HttpServletResponse httpResponse) throws AlipayApiException, IOException {
// 1. 创建Client，通用SDK提供的Client，负责调用支付宝的API
        AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, aliPayConfig.getAppId(),
                aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);

        // 2. 创建 Request并设置Request参数
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        // 发送请求的 Request类
        request.setNotifyUrl(aliPayConfig.getNotifyUrl());
        JSONObject bizContent = new JSONObject();
        bizContent.set("out_trade_no", aliPay.getTraceNo());
        // 我们自己生成的订单编号
        bizContent.set("total_amount", aliPay.getTotalAmount());
        // 订单的总金额
        bizContent.set("subject", aliPay.getSubject());
        // 支付的名称
        bizContent.set("product_code", "FAST_INSTANT_TRADE_PAY");
        // 固定配置
        request.setBizContent(bizContent.toString());

        // 执行请求，拿到响应的结果，返回给浏览器
        String form = "";
        try {
            form = alipayClient.pageExecute(request).getBody();
            // 调用SDK生成表单
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        httpResponse.setContentType("text/html;charset=" + CHARSET);
        httpResponse.getWriter().write(form);
        // 直接将完整的表单html输出到页面
        httpResponse.getWriter().flush();
        httpResponse.getWriter().close();
    }

    @Override
    public String returnPay(AliPay aliPay) throws AlipayApiException {
        // 7天无理由退款
        String now = DateUtil.now();
        // 根据aliPay.getTraceNo()id获取订单详细信息
        // Orders orders = ordersMapper.getByNo(aliPay.getTraceNo());
        ObjectOrder orders = new ObjectOrder();
        orders.setOrderPaymentPrice(new BigDecimal(5000));
        if (orders != null) {
            // hutool工具类，判断时间间隔
            long between = DateUtil.between(DateUtil.parseDateTime((CharSequence) orders.getOrderPaymentTime()), DateUtil.parseDateTime(now), DateUnit.DAY);
            if (between > 7) {
                return "该订单已超过7天，不支持退款";
            }
        }

        // 1. 创建Client，通用SDK提供的Client，负责调用支付宝的API
        AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL,
                aliPayConfig.getAppId(), aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET,
                aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);
        // 2. 创建 Request，设置参数
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        JSONObject bizContent = new JSONObject();
        bizContent.set("trade_no", aliPay.getAlipayTraceNo());
        // 支付宝回调的订单流水号
        bizContent.set("refund_amount", aliPay.getTotalAmount());
        // 订单的总金额
        bizContent.set("out_request_no", aliPay.getTraceNo());
        // 自己生成的订单编号

        // 返回参数选项，按需传入
        //JSONArray queryOptions = new JSONArray();
        //queryOptions.add("refund_detail_item_list");
        //bizContent.put("query_options", queryOptions);

        request.setBizContent(bizContent.toString());

        // 3. 执行请求
        AlipayTradeRefundResponse response = alipayClient.execute(request);
        if (response.isSuccess()) {
            // 退款成功，isSuccess 为true
            System.out.println("调用成功");

            // 4. 更新数据库状态
            //ordersMapper.updatePayState(aliPay.getTraceNo(), "已退款", now);
            return "退款成功";
        } else {
            // 退款失败，isSuccess 为false
            System.out.println(response.getBody());
            //return Result.error(response.getCode(), response.getBody());
            return "退款失败";
        }
    }
}
